package com.xssn.fjnd.content.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xssn.fjnd.content.req.PhotoREQ;
import com.xssn.fjnd.entities.Photo;
import com.xssn.fjnd.content.mapper.PhotoMapper;
import com.xssn.fjnd.content.service.IPhotoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xssn.util.aliyun.AliyunUtil;
import com.xssn.util.base.Result;
import com.xssn.util.properties.XssnOssProperties;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * <p>
 * 演出图片信息表 服务实现类
 * </p>
 *
 * @author 线狮少年
 * @since 2023-08-14
 */
@Service
public class PhotoServiceImpl extends ServiceImpl<PhotoMapper, Photo> implements IPhotoService {


    @Override
    public Result queryPage(PhotoREQ req) {
        QueryWrapper<Photo> wrapper = new QueryWrapper<>();
        //根据演出图片标题（title）和演出图片状态（status）查询
        if (StringUtils.isNotEmpty(req.getTitle())) {
            wrapper.like("title", req.getTitle());
        }
        if (req.getType() != null) {
            wrapper.eq("type", req.getType());
        }
        wrapper.orderByDesc("thumhup").orderByDesc("update_date");
        IPage<Photo> page = baseMapper.selectPage(req.getPage(), wrapper);
        return Result.ok(page);
    }

    @Transactional // 事务管理
    @Override
    public Result updateOrSave(Photo photo) {
        // 1. 如果id不为空，则是更新操作
        if(StringUtils.isNotEmpty(photo.getId())) {
            // 更新：将更新时间设置当前时间
            photo.setUpdateDate(new Date());
        }

        // 更新或保存演出图片信息（新增数据后，会将这条新增数据的主键id值放到id属性中）
        super.saveOrUpdate(photo);

        // 返回演出图片id
        return Result.ok(photo.getId());
    }

    @Autowired
    private XssnOssProperties xssnOssProperties;
    @Transactional
    @Override
    public Result deleteById(String id) {
        // 1. 先通过广告id查询图片url
        String imageUrl = baseMapper.selectById(id).getImageUrl();

        // 2. 先删除表中的广告信息
        baseMapper.deleteById(id);

        // 3. 删除oss上的图片
        if(StringUtils.isNotEmpty(imageUrl)) {
            AliyunUtil.delete(imageUrl, xssnOssProperties.getAliyun());
        }
        return Result.ok();
    }


    @Override
    public Result updateThumhup(String id, int count) {
        if(count != -1 && count != 1) {
            return Result.error("无效操作");
        }

        if(StringUtils.isEmpty(id)) {
            return Result.error("无效操作");
        }

        // 查询这演出图片现有数据，查询到后，将点赞数进行更新
        Photo photo = baseMapper.selectById(id);
        if(photo == null) {
            return Result.error("演出图片不存在");
        }

        if(photo.getThumhup() <= 0 && count == -1) {
            return Result.error("无效操作");
        }
        // 更新点赞数
        photo.setThumhup( photo.getThumhup() + count );
        baseMapper.updateById(photo);

        return Result.ok();
    }


    @Override
    public Result updateViewCount(String id) {
        if(StringUtils.isEmpty(id)) {
            return Result.error("无效操作");
        }
        Photo photo = baseMapper.selectById(id);
        if(photo == null){
            return Result.error("演出图片不存在");
        }
        photo.setViewCount( photo.getViewCount() + 1 );

        baseMapper.updateById(photo);
        return Result.ok();
    }


    @Override
    public Result getPhotoTotal() {
        QueryWrapper<Photo> wrapper = new QueryWrapper<>();
        // 公开
        wrapper.eq("ispublic", 1);

        Integer total = baseMapper.selectCount(wrapper);
        return Result.ok(total);
    }

    @Override
    public Result publicPage(PhotoREQ req) {
        QueryWrapper<Photo> wrapper = new QueryWrapper<>();
        //根据演出图片标题（title）和演出图片状态（status）查询
        if (StringUtils.isNotEmpty(req.getTitle())) {
            wrapper.like("title", req.getTitle());
        }
        if (req.getType() != null) {
            wrapper.eq("type", req.getType());
        }
        // 公开
        wrapper.eq("ispublic", 1);
        wrapper.orderByDesc("view_count").orderByDesc("thumhup");
        IPage<Photo> page = baseMapper.selectPage(req.getPage(), wrapper);
        return Result.ok(page);
    }
}
